// app.js
// 保存原始 Page 构造函数
const originalPage = Page;

// 不需要登录验证的页面路径
const authPages = [
  '/pages/login/index',
];

// 登录检查状态管理
let isCheckingLogin = false;
let pendingPages = [];

// 重写 Page 方法
Page = function(config) {
  // 保存原始生命周期方法
  const originalOnLoad = config.onLoad || function(args) {};
  const originalOnShow = config.onShow || function(args) {};
  
  // 重写 onLoad 方法 - 只执行一次
  config.onLoad = function(options) {
    this.route = this.__route__ || this.route; // 获取当前页面路径
    
    // 如果是需要验证的页面
    if (!authPages.includes(this.route)) {
      // 保存页面上下文和参数
      this._pageOptions = options;
      
      // 如果正在检查登录状态，将页面加入等待队列
      if (isCheckingLogin) {
        pendingPages.push(this);
        return;
      }
      
      // 开始登录检查流程
      this._startLoginCheck();
    } else {
      // 不需要登录的页面直接执行原始 onLoad
      originalOnLoad.call(this, options);
    }
  };
  
  // 重写 onShow 方法 - 页面每次显示时执行
  config.onShow = function() {
    // 如果已经处理过登录检查，直接执行原始 onShow
    if (this._loginChecked) {
      originalOnShow.call(this);
      return;
    }
    
    // 对于需要验证的页面，在 onShow 中不主动触发登录检查
    // 而是等待 onLoad 中的检查流程
    if (!authPages.includes(this.route)) {
      // 如果 onLoad 中已经开始了检查，则不重复执行
      if (!isCheckingLogin && !this._loginCheckStarted) {
        this._startLoginCheck();
      }
    } else {
      // 不需要登录的页面直接执行原始 onShow
      originalOnShow.call(this);
    }
  };
  
  // 添加登录检查方法
  config._startLoginCheck = function() {
    // 标记检查已开始
    this._loginCheckStarted = true;
    isCheckingLogin = true;
    
    // 执行登录检查
    this.checkLogin().then(() => {
      // 登录验证通过
      this._loginChecked = true;
      isCheckingLogin = false;
      
      // 执行原始 onLoad
      originalOnLoad.call(this, this._pageOptions);
      
      // 处理等待中的页面
      this._processPendingPages();
    }).catch(() => {
      // 登录检查失败，但不需要额外处理（已经跳转到登录页）
      isCheckingLogin = false;
    });
  };
  
  // 处理等待中的页面
  config._processPendingPages = function() {
    if (pendingPages.length === 0) return;
    
    const pagesToProcess = [...pendingPages];
    pendingPages = [];
    
    pagesToProcess.forEach(page => {
      if (page && typeof page._startLoginCheck === 'function') {
        page._startLoginCheck();
      }
    });
  };
  
  // 添加检查登录的方法
  config.checkLogin = function() {
    return new Promise((resolve, reject) => {
      const token = wx.getStorageSync('token');
      
      if (token) {
        resolve(); // 已登录，继续执行
      } else {
        // 未登录，跳转到登录页
        const pages = getCurrentPages();
        const currentPage = pages[pages.length - 1];
        let returnUrl = `/${currentPage.route}`;

        if (authPages.includes(returnUrl)){
          resolve()
          return
        }
        
        // 携带页面参数
        if (currentPage.options) {
          const params = Object.keys(currentPage.options)
            .map(key => `${key}=${encodeURIComponent(currentPage.options[key])}`)
            .join('&');
          returnUrl += `?${params}`;
        }
        
        // 存储返回路径
        wx.setStorageSync('returnUrl', returnUrl);
        
        

        // 显示提示
        wx.showToast({
          title: '请先登录',
          icon: 'none',
          duration: 1500
        });
        
        // 延迟跳转，避免与页面生命周期冲突
        setTimeout(() => {
          wx.redirectTo({
            url: '/pages/login/index'
          });
          reject('未登录');
        }, 500);
      }
    });
  };
  
  // 调用原始 Page 构造函数
  originalPage(config);
};

App({
  onLaunch() {
    let res = wx.getWindowInfo()
    this.globalData.statusHight = res.statusBarHeight
  },
  globalData: {
    userInfo: null,
    statusHight: 0
  }
})
